use std::iter::Map;

fn main() {


    // 结构体有三种类型

    // 元组结构体
    struct Pair(i32, f32);
    // 单元结构体
    struct  Unit;
    // 带有字段的结构体
    struct Point {
        x: i32,
        y: i32
    }


    // 结构体可以作为另一个结构体的字段
    struct Map{
        title:String,
        point:Point
    }

    // 结构体初始化
    // 1
    let title=String::new();
    let point = Point { x: 15, y: 15 };
    let map=Map{title,point};

    // 2
    let map1:Map=Map{
        title: String::from("hello"),
        point: Point{
            x:1,
            y:2
        }
    };
    println!("{:?},{:?}",point.x,point.y);


    // 实例化一个单元结构体
    let _unit=Unit;

    // 实例化一个元组结构体
    let pair=Pair(1,3.0);

    // 解构元组结构体
    let Pair(intergerm,decimal)=pair;

    // 方法

    // 元祖结构体方法
    struct  Color1(u8,u8,u8);
    impl  Color1{
        fn  print(&self){
            println!("Color: ({}, {}, {})", self.0, self.1, self.2);
        }
    }
    let color1= Color1(255,0,0);
    color1.print();


    // 类C结构体方法
    struct PersonClass{
        name:String,
        age:i32
    }

    impl PersonClass {
        fn print_info(&self){
            println!("person info: ({}, {})", self.name, self.age);
        }
    }

    let person= PersonClass{
        name: String::from(""),
        age : 12,
    };
    person.print_info();

    // 单元结构体的方法
    struct Dummy;

    impl Dummy {
        fn do_something(&self) {
            println!("Doing something...");
        }
    }

    let dummy_instance = Dummy;
    dummy_instance.do_something();


    // 枚举
    // enum 关键字允许创建一个从数不同取值中选其一的枚举类型
    enum Message{
        // 一个enum可以是单元结构体
        Quit,
        // 元组结构体
        KeyPress(char),
        // 普通结构体
        Point {
            x: i32,
            y: i32
        }
    }


    // tuple struct
    struct Color(u8, u8, u8);

    let Color(red, green, blue) = Color(0xa4, 0xc6, 0x39);
    println!("{0}",red);

    // 方法
    fn printEnum(enumTest: Message){
        match enumTest {
            Message::KeyPress('1')=> println!("张三"),
            Message::Quit=> println!("张三Quit"),
            Message::Point(1,2)=> println!("张三Point"),
            _ => {}
        }
    }

    // 枚举实例化
    let quit=Message::Quit;
    printEnum(quit);

    // 常见的枚举 Option 和Result

    // Option: 表示一个值可能存在或不存在,其成员为 Some(T)（其中 T 是某种类型）和 None。
    // Result：表示一个操作可能成功或失败。其成员为 Ok(T)（其中 T 是某种类型）和 Err(E)（其中 E 是错误类型）。

    // 类型别名
    // 若使用类型别名，可以通过其别名引用每个枚举变量，
    enum VeryVerboseEnumOfThingsToDoWithNumbers{
        Add,
        Subtract
    }

    // 创建一个类型别名
    type  verVerboseEnum=VeryVerboseEnumOfThingsToDoWithNumbers;

    // 使用use声明就不写出名称的完整路径
    enum Status {
        Rich,
        Poor,
    }

    // 显式地`use`各个名称
    use Status::{Rich};
    // 自动地 use 枚举的各个名称
    use Status::*;

    // 等价于Status::Rich
    let rich=Rich;

    // 性别
    enum Sex {
        Man=1,
        Woman=2,
    }
}
